24#include "config/aom_config.h"
31#include "aom/aom_integer.h"
33#include "aom_dsp/bitwriter_buffer.h"
34#include "aom_ports/aom_timer.h"
35#include "av1/ratectrl_rtc.h"
36#include "common/args.h"
37#include "common/tools_common.h"
38#include "common/video_writer.h"
39#include "examples/encoder_util.h"
40#include "examples/multilayer_metadata.h"
42#define OPTION_BUFFER_SIZE 1024
43#define MAX_NUM_SPATIAL_LAYERS 4
46 const char *output_filename;
47 char options[OPTION_BUFFER_SIZE];
48 struct AvxInputContext input_ctx[MAX_NUM_SPATIAL_LAYERS];
57 bool scale_factors_explicitly_set;
58 const char *multilayer_metadata_file;
69static const arg_def_t outputfile =
70 ARG_DEF(
"o",
"output", 1,
"Output filename");
71static const arg_def_t frames_arg =
72 ARG_DEF(
"f",
"frames", 1,
"Number of frames to encode");
73static const arg_def_t threads_arg =
74 ARG_DEF(
"th",
"threads", 1,
"Number of threads to use");
75static const arg_def_t width_arg = ARG_DEF(
"w",
"width", 1,
"Source width");
76static const arg_def_t height_arg = ARG_DEF(
"h",
"height", 1,
"Source height");
77static const arg_def_t timebase_arg =
78 ARG_DEF(
"t",
"timebase", 1,
"Timebase (num/den)");
79static const arg_def_t bitrate_arg = ARG_DEF(
80 "b",
"target-bitrate", 1,
"Encoding bitrate, in kilobits per second");
81static const arg_def_t spatial_layers_arg =
82 ARG_DEF(
"sl",
"spatial-layers", 1,
"Number of spatial SVC layers");
83static const arg_def_t temporal_layers_arg =
84 ARG_DEF(
"tl",
"temporal-layers", 1,
"Number of temporal SVC layers");
85static const arg_def_t layering_mode_arg =
86 ARG_DEF(
"lm",
"layering-mode", 1,
"Temporal layering scheme.");
87static const arg_def_t kf_dist_arg =
88 ARG_DEF(
"k",
"kf-dist", 1,
"Number of frames between keyframes");
89static const arg_def_t scale_factors_arg =
90 ARG_DEF(
"r",
"scale-factors", 1,
"Scale factors (lowest to highest layer)");
91static const arg_def_t min_q_arg =
92 ARG_DEF(NULL,
"min-q", 1,
"Minimum quantizer");
93static const arg_def_t max_q_arg =
94 ARG_DEF(NULL,
"max-q", 1,
"Maximum quantizer");
95static const arg_def_t speed_arg =
96 ARG_DEF(
"sp",
"speed", 1,
"Speed configuration");
97static const arg_def_t aqmode_arg =
98 ARG_DEF(
"aq",
"aqmode", 1,
"AQ mode off/on");
99static const arg_def_t bitrates_arg =
100 ARG_DEF(
"bl",
"bitrates", 1,
101 "Bitrates[spatial_layer * num_temporal_layer + temporal_layer]");
102static const arg_def_t dropframe_thresh_arg =
103 ARG_DEF(NULL,
"drop-frame", 1,
"Temporal resampling threshold (buf %)");
104static const arg_def_t error_resilient_arg =
105 ARG_DEF(NULL,
"error-resilient", 1,
"Error resilient flag");
106static const arg_def_t output_obu_arg =
107 ARG_DEF(NULL,
"output-obu", 1,
108 "Write OBUs when set to 1. Otherwise write IVF files.");
109static const arg_def_t test_decode_arg =
110 ARG_DEF(NULL,
"test-decode", 1,
111 "Attempt to test decoding the output when set to 1. Default is 1.");
112static const arg_def_t psnr_arg =
113 ARG_DEF(NULL,
"psnr", -1,
"Show PSNR in status line.");
114static const arg_def_t ext_rc_arg =
115 ARG_DEF(NULL,
"use-ext-rc", 0,
"Use external rate control.");
116static const struct arg_enum_list tune_content_enum[] = {
117 {
"default", AOM_CONTENT_DEFAULT },
118 {
"screen", AOM_CONTENT_SCREEN },
119 {
"film", AOM_CONTENT_FILM },
122static const arg_def_t tune_content_arg = ARG_DEF_ENUM(
123 NULL,
"tune-content", 1,
"Tune content type", tune_content_enum);
124static const arg_def_t multilayer_metadata_file_arg =
125 ARG_DEF(
"ml",
"multilayer_metadata_file", 1,
126 "Experimental: path to multilayer metadata file");
128#if CONFIG_AV1_HIGHBITDEPTH
129static const struct arg_enum_list bitdepth_enum[] = { {
"8",
AOM_BITS_8 },
133static const arg_def_t bitdepth_arg = ARG_DEF_ENUM(
134 "d",
"bit-depth", 1,
"Bit depth for codec 8 or 10. ", bitdepth_enum);
137static const arg_def_t *svc_args[] = {
138 &frames_arg, &outputfile, &width_arg,
139 &height_arg, &timebase_arg, &bitrate_arg,
140 &spatial_layers_arg, &kf_dist_arg, &scale_factors_arg,
141 &min_q_arg, &max_q_arg, &temporal_layers_arg,
142 &layering_mode_arg, &threads_arg, &aqmode_arg,
143#if CONFIG_AV1_HIGHBITDEPTH
146 &speed_arg, &bitrates_arg, &dropframe_thresh_arg,
147 &error_resilient_arg, &output_obu_arg, &test_decode_arg,
148 &tune_content_arg, &psnr_arg, NULL,
151#define zero(Dest) memset(&(Dest), 0, sizeof(Dest))
153static const char *exec_name;
155void usage_exit(
void) {
157 "Usage: %s <options> input_filename [input_filename ...] -o "
160 fprintf(stderr,
"Options:\n");
161 arg_show_usage(stderr, svc_args);
164 "Input files must be y4m or yuv.\n"
165 "If multiple input files are specified, they correspond to spatial "
166 "layers, and there should be as many as there are spatial layers.\n"
167 "All input files must have the same width, height, frame rate and number "
169 "If only one file is specified, it is used for all spatial layers.\n");
173static int file_is_y4m(
const char detect[4]) {
174 return memcmp(detect,
"YUV4", 4) == 0;
177static int fourcc_is_ivf(
const char detect[4]) {
178 if (memcmp(detect,
"DKIF", 4) == 0) {
184static const int option_max_values[ALL_OPTION_TYPES] = { 63, INT_MAX, INT_MAX,
187static const int option_min_values[ALL_OPTION_TYPES] = { 0, 0, 1, 0 };
189static void open_input_file(
struct AvxInputContext *input,
192 input->file = strcmp(input->filename,
"-") ? fopen(input->filename,
"rb")
193 : set_binary_mode(stdin);
195 if (!input->file) fatal(
"Failed to open input file");
197 if (!fseeko(input->file, 0, SEEK_END)) {
201 input->length = ftello(input->file);
206 input->pixel_aspect_ratio.numerator = 1;
207 input->pixel_aspect_ratio.denominator = 1;
212 input->detect.buf_read = fread(input->detect.buf, 1, 4, input->file);
213 input->detect.position = 0;
215 if (input->detect.buf_read == 4 && file_is_y4m(input->detect.buf)) {
216 if (y4m_input_open(&input->y4m, input->file, input->detect.buf, 4, csp,
217 input->only_i420) >= 0) {
218 input->file_type = FILE_TYPE_Y4M;
219 input->width = input->y4m.pic_w;
220 input->height = input->y4m.pic_h;
221 input->pixel_aspect_ratio.numerator = input->y4m.par_n;
222 input->pixel_aspect_ratio.denominator = input->y4m.par_d;
223 input->framerate.numerator = input->y4m.fps_n;
224 input->framerate.denominator = input->y4m.fps_d;
225 input->fmt = input->y4m.aom_fmt;
228 fatal(
"Unsupported Y4M stream.");
230 }
else if (input->detect.buf_read == 4 && fourcc_is_ivf(input->detect.buf)) {
231 fatal(
"IVF is not supported as input.");
233 input->file_type = FILE_TYPE_RAW;
237static aom_codec_err_t extract_option(LAYER_OPTION_TYPE type,
char *input,
238 int *value0,
int *value1) {
239 if (type == SCALE_FACTOR) {
240 *value0 = (int)strtol(input, &input, 10);
242 *value1 = (int)strtol(input, &input, 10);
244 if (*value0 < option_min_values[SCALE_FACTOR] ||
245 *value1 < option_min_values[SCALE_FACTOR] ||
246 *value0 > option_max_values[SCALE_FACTOR] ||
247 *value1 > option_max_values[SCALE_FACTOR] ||
251 *value0 = atoi(input);
252 if (*value0 < option_min_values[type] || *value0 > option_max_values[type])
260 int *option0,
int *option1) {
264 const char *delim =
",";
272 if (input == NULL || option0 == NULL ||
273 (option1 == NULL && type == SCALE_FACTOR))
276 const size_t input_length = strlen(input);
277 input_string =
reinterpret_cast<char *
>(malloc(input_length + 1));
279 memcpy(input_string, input, input_length + 1);
280 token = strtok(input_string, delim);
281 for (i = 0; i < num_layers; ++i) {
283 res = extract_option(type, token, option0 + i, option1 + i);
285 token = strtok(NULL, delim);
295static void parse_command_line(
int argc,
const char **argv_,
303 char string_options[1024] = { 0 };
308 app_input->layering_mode = 0;
309 app_input->output_obu = 0;
310 app_input->decode = 1;
315 argv = argv_dup(argc - 1, argv_ + 1);
317 fprintf(stderr,
"Error allocating argument list\n");
320 for (argi = argj = argv; (*argj = *argi); argi += arg.argv_step) {
323 if (arg_match(&arg, &outputfile, argi)) {
324 app_input->output_filename = arg.val;
325 }
else if (arg_match(&arg, &width_arg, argi)) {
326 enc_cfg->
g_w = arg_parse_uint(&arg);
327 }
else if (arg_match(&arg, &height_arg, argi)) {
328 enc_cfg->
g_h = arg_parse_uint(&arg);
329 }
else if (arg_match(&arg, &timebase_arg, argi)) {
330 enc_cfg->
g_timebase = arg_parse_rational(&arg);
331 }
else if (arg_match(&arg, &bitrate_arg, argi)) {
333 }
else if (arg_match(&arg, &spatial_layers_arg, argi)) {
335 }
else if (arg_match(&arg, &temporal_layers_arg, argi)) {
337 }
else if (arg_match(&arg, &speed_arg, argi)) {
338 app_input->speed = arg_parse_uint(&arg);
339 if (app_input->speed > 11) {
340 aom_tools_warn(
"Mapping speed %d to speed 11.\n", app_input->speed);
342 }
else if (arg_match(&arg, &aqmode_arg, argi)) {
343 app_input->aq_mode = arg_parse_uint(&arg);
344 }
else if (arg_match(&arg, &threads_arg, argi)) {
345 enc_cfg->
g_threads = arg_parse_uint(&arg);
346 }
else if (arg_match(&arg, &layering_mode_arg, argi)) {
347 app_input->layering_mode = arg_parse_int(&arg);
348 }
else if (arg_match(&arg, &kf_dist_arg, argi)) {
351 }
else if (arg_match(&arg, &scale_factors_arg, argi)) {
355 app_input->scale_factors_explicitly_set =
true;
357 die(
"Failed to parse scale factors: %s\n",
360 }
else if (arg_match(&arg, &min_q_arg, argi)) {
362 }
else if (arg_match(&arg, &max_q_arg, argi)) {
364#if CONFIG_AV1_HIGHBITDEPTH
365 }
else if (arg_match(&arg, &bitdepth_arg, argi)) {
378 die(
"Error: Invalid bit depth selected (%d)\n", enc_cfg->
g_bit_depth);
381 }
else if (arg_match(&arg, &dropframe_thresh_arg, argi)) {
383 }
else if (arg_match(&arg, &error_resilient_arg, argi)) {
386 die(
"Invalid value for error resilient (0, 1): %d.",
388 }
else if (arg_match(&arg, &output_obu_arg, argi)) {
389 app_input->output_obu = arg_parse_uint(&arg);
390 if (app_input->output_obu != 0 && app_input->output_obu != 1)
391 die(
"Invalid value for obu output flag (0, 1): %d.",
392 app_input->output_obu);
393 }
else if (arg_match(&arg, &test_decode_arg, argi)) {
394 app_input->decode = arg_parse_uint(&arg);
395 if (app_input->decode != 0 && app_input->decode != 1)
396 die(
"Invalid value for test decode flag (0, 1): %d.",
398 }
else if (arg_match(&arg, &tune_content_arg, argi)) {
399 app_input->tune_content = arg_parse_enum_or_int(&arg);
400 printf(
"tune content %d\n", app_input->tune_content);
401 }
else if (arg_match(&arg, &psnr_arg, argi)) {
402 app_input->show_psnr = 1;
403 }
else if (arg_match(&arg, &ext_rc_arg, argi)) {
404 app_input->use_external_rc =
true;
405 }
else if (arg_match(&arg, &multilayer_metadata_file_arg, argi)) {
406 app_input->multilayer_metadata_file = arg.val;
413 for (argi = argj = argv; (*argj = *argi); argi += arg.argv_step) {
415 if (arg_match(&arg, &bitrates_arg, argi)) {
427 if (strlen(string_options) > 0)
428 strncpy(app_input->options, string_options, OPTION_BUFFER_SIZE);
431 for (argi = argv; *argi; ++argi)
432 if (argi[0][0] ==
'-' && strlen(argi[0]) > 1)
433 die(
"Error: Unrecognized option %s\n", *argi);
435 if (argv[0] == NULL) {
440 while (argv[input_count] != NULL && input_count < MAX_NUM_SPATIAL_LAYERS) {
441 app_input->input_ctx[input_count].filename = argv[input_count];
445 die(
"Error: Number of input files does not match number of spatial layers");
447 if (argv[input_count] != NULL) {
448 die(
"Error: Too many input files specified, there should be at most %d",
449 MAX_NUM_SPATIAL_LAYERS);
454 for (
int i = 0; i < input_count; ++i) {
456 if (app_input->input_ctx[i].file_type == FILE_TYPE_Y4M) {
457 if (enc_cfg->
g_w == 0 || enc_cfg->
g_h == 0) {
459 enc_cfg->
g_w = app_input->input_ctx[i].width;
460 enc_cfg->
g_h = app_input->input_ctx[i].height;
462 enc_cfg->
g_timebase.
num = app_input->input_ctx[i].framerate.denominator;
463 enc_cfg->
g_timebase.
den = app_input->input_ctx[i].framerate.numerator;
464 }
else if (enc_cfg->
g_w != app_input->input_ctx[i].width ||
465 enc_cfg->
g_h != app_input->input_ctx[i].height ||
467 app_input->input_ctx[i].framerate.denominator ||
469 app_input->input_ctx[i].framerate.numerator) {
470 die(
"Error: Input file dimensions and/or frame rate mismatch");
474 if (enc_cfg->
g_w == 0 || enc_cfg->
g_h == 0) {
475 die(
"Error: Input file dimensions not set, use -w and -h");
478 if (enc_cfg->
g_w < 16 || enc_cfg->
g_w % 2 || enc_cfg->
g_h < 16 ||
480 die(
"Invalid resolution: %d x %d\n", enc_cfg->
g_w, enc_cfg->
g_h);
485 "width %u, height: %u\n"
486 "num: %d, den: %d, bitrate: %u\n"
494static int mode_to_num_temporal_layers[12] = {
495 1, 2, 3, 3, 2, 1, 1, 3, 3, 3, 3, 3,
497static int mode_to_num_spatial_layers[12] = {
498 1, 1, 1, 1, 1, 2, 3, 2, 3, 3, 3, 3,
502struct RateControlMetrics {
519 double avg_st_encoding_bitrate;
521 double variance_st_encoding_bitrate;
529static const int REF_FRAMES = 8;
531static const int INTER_REFS_PER_FRAME = 7;
544static int read_frame(
struct AvxInputContext *input_ctx,
aom_image_t *img) {
545 FILE *f = input_ctx->file;
546 y4m_input *y4m = &input_ctx->y4m;
549 if (input_ctx->file_type == FILE_TYPE_Y4M) {
550 if (y4m_input_fetch_frame(y4m, f, img) < 1)
return 0;
552 shortread = read_yuv_frame(input_ctx, img);
558static void close_input_file(
struct AvxInputContext *input) {
560 if (input->file_type == FILE_TYPE_Y4M) y4m_input_close(&input->y4m);
569static void set_rate_control_metrics(
struct RateControlMetrics *rc,
570 double framerate,
int ss_number_layers,
571 int ts_number_layers) {
573 ts_rate_decimator[0] = 1;
574 if (ts_number_layers == 2) {
575 ts_rate_decimator[0] = 2;
576 ts_rate_decimator[1] = 1;
578 if (ts_number_layers == 3) {
579 ts_rate_decimator[0] = 4;
580 ts_rate_decimator[1] = 2;
581 ts_rate_decimator[2] = 1;
585 for (
int sl = 0; sl < ss_number_layers; ++sl) {
586 int i = sl * ts_number_layers;
587 rc->layer_framerate[0] = framerate / ts_rate_decimator[0];
589 1000.0 * rc->layer_target_bitrate[i] / rc->layer_framerate[0];
590 for (
int tl = 0; tl < ts_number_layers; ++tl) {
591 i = sl * ts_number_layers + tl;
593 rc->layer_framerate[tl] = framerate / ts_rate_decimator[tl];
596 (rc->layer_target_bitrate[i] - rc->layer_target_bitrate[i - 1]) /
597 (rc->layer_framerate[tl] - rc->layer_framerate[tl - 1]);
599 rc->layer_input_frames[tl] = 0;
600 rc->layer_enc_frames[tl] = 0;
601 rc->layer_encoding_bitrate[i] = 0.0;
602 rc->layer_avg_frame_size[i] = 0.0;
603 rc->layer_avg_rate_mismatch[i] = 0.0;
606 rc->window_count = 0;
607 rc->window_size = 15;
608 rc->avg_st_encoding_bitrate = 0.0;
609 rc->variance_st_encoding_bitrate = 0.0;
612static void printout_rate_control_summary(
struct RateControlMetrics *rc,
613 int frame_cnt,
int ss_number_layers,
614 int ts_number_layers) {
615 int tot_num_frames = 0;
616 double perc_fluctuation = 0.0;
617 printf(
"Total number of processed frames: %d\n\n", frame_cnt - 1);
618 printf(
"Rate control layer stats for %d layer(s):\n\n", ts_number_layers);
619 for (
int sl = 0; sl < ss_number_layers; ++sl) {
621 for (
int tl = 0; tl < ts_number_layers; ++tl) {
622 int i = sl * ts_number_layers + tl;
623 const int num_dropped =
624 tl > 0 ? rc->layer_input_frames[tl] - rc->layer_enc_frames[tl]
625 : rc->layer_input_frames[tl] - rc->layer_enc_frames[tl] - 1;
626 tot_num_frames += rc->layer_input_frames[tl];
627 rc->layer_encoding_bitrate[i] = 0.001 * rc->layer_framerate[tl] *
628 rc->layer_encoding_bitrate[i] /
630 rc->layer_avg_frame_size[i] =
631 rc->layer_avg_frame_size[i] / rc->layer_enc_frames[tl];
632 rc->layer_avg_rate_mismatch[i] =
633 100.0 * rc->layer_avg_rate_mismatch[i] / rc->layer_enc_frames[tl];
634 printf(
"For layer#: %d %d \n", sl, tl);
635 printf(
"Bitrate (target vs actual): %d %f\n", rc->layer_target_bitrate[i],
636 rc->layer_encoding_bitrate[i]);
637 printf(
"Average frame size (target vs actual): %f %f\n", rc->layer_pfb[i],
638 rc->layer_avg_frame_size[i]);
639 printf(
"Average rate_mismatch: %f\n", rc->layer_avg_rate_mismatch[i]);
641 "Number of input frames, encoded (non-key) frames, "
642 "and perc dropped frames: %d %d %f\n",
643 rc->layer_input_frames[tl], rc->layer_enc_frames[tl],
644 100.0 * num_dropped / rc->layer_input_frames[tl]);
648 rc->avg_st_encoding_bitrate = rc->avg_st_encoding_bitrate / rc->window_count;
649 rc->variance_st_encoding_bitrate =
650 rc->variance_st_encoding_bitrate / rc->window_count -
651 (rc->avg_st_encoding_bitrate * rc->avg_st_encoding_bitrate);
652 perc_fluctuation = 100.0 * sqrt(rc->variance_st_encoding_bitrate) /
653 rc->avg_st_encoding_bitrate;
654 printf(
"Short-time stats, for window of %d frames:\n", rc->window_size);
655 printf(
"Average, rms-variance, and percent-fluct: %f %f %f\n",
656 rc->avg_st_encoding_bitrate, sqrt(rc->variance_st_encoding_bitrate),
658 if (frame_cnt - 1 != tot_num_frames)
659 die(
"Error: Number of input frames not equal to output!\n");
663static void set_layer_pattern(
667 int spatial_layer_id,
int is_key_frame,
int ksvc_mode,
int speed) {
670 int use_rps_example = 0;
672 int enable_longterm_temporal_ref = 1;
673 int shift = (layering_mode == 8) ? 2 : 0;
674 int simulcast_mode = (layering_mode == 11);
675 *use_svc_control = 1;
678 int base_count = superframe_cnt >> 2;
685 for (i = 0; i < INTER_REFS_PER_FRAME; i++) ref_frame_config->
ref_idx[i] = i;
686 for (i = 0; i < INTER_REFS_PER_FRAME; i++) ref_frame_config->
reference[i] = 0;
687 for (i = 0; i < REF_FRAMES; i++) ref_frame_config->
refresh[i] = 0;
694 switch (layering_mode) {
696 if (use_rps_example == 0) {
700 ref_frame_config->
refresh[0] = 1;
701 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
709 int last_idx_refresh = 0;
718 if (superframe_cnt > 1) last_idx = (superframe_cnt - 1) % sh;
720 last_idx_refresh = superframe_cnt % sh;
722 if (superframe_cnt > lag_gld) gld_idx = (superframe_cnt - lag_gld) % sh;
724 if (superframe_cnt > lag_alt)
725 alt_ref_idx = (superframe_cnt - lag_alt) % sh;
728 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
729 ref_frame_config->
ref_idx[i] = last_idx;
731 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = last_idx;
732 ref_frame_config->
ref_idx[SVC_LAST2_FRAME] = last_idx_refresh;
733 ref_frame_config->
ref_idx[SVC_GOLDEN_FRAME] = gld_idx;
734 ref_frame_config->
ref_idx[SVC_ALTREF_FRAME] = alt_ref_idx;
736 ref_frame_config->
refresh[last_idx_refresh] = 1;
738 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
739 ref_frame_config->
reference[SVC_ALTREF_FRAME] = 1;
740 ref_frame_config->
reference[SVC_GOLDEN_FRAME] = 1;
742 if (superframe_cnt % 200 == 0 && superframe_cnt > 0) {
743 ref_frame_config->
reference[SVC_LAST_FRAME] = 0;
744 ref_frame_config->
reference[SVC_ALTREF_FRAME] = 0;
745 ref_frame_config->
reference[SVC_GOLDEN_FRAME] = 1;
749 if (superframe_cnt % 400 == 0 && superframe_cnt > 0) {
750 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = gld_idx;
751 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
752 ref_frame_config->
reference[SVC_ALTREF_FRAME] = 0;
753 ref_frame_config->
reference[SVC_GOLDEN_FRAME] = 0;
763 base_count = superframe_cnt >> 1;
764 ref_frame_config->
ref_idx[SVC_GOLDEN_FRAME] = 3;
767 if (base_count > 0) {
768 lag_index = 5 + (base_count % 3);
769 if (superframe_cnt % 2 != 0) lag_index = 5 + ((base_count + 1) % 3);
772 ref_frame_config->
ref_idx[SVC_ALTREF_FRAME] = lag_index;
773 if (superframe_cnt % 2 == 0) {
776 ref_frame_config->
refresh[0] = 1;
777 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
779 ref_frame_config->
refresh[lag_index] = 1;
781 if (base_count % 32 == 0) ref_frame_config->
refresh[3] = 1;
785 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
789 ref_frame_config->
reference[SVC_GOLDEN_FRAME] = 1;
790 ref_frame_config->
reference[SVC_ALTREF_FRAME] = 1;
798 if (superframe_cnt % 4 == 0) {
802 ref_frame_config->
refresh[0] = 1;
803 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
804 }
else if ((superframe_cnt - 1) % 4 == 0) {
807 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
808 }
else if ((superframe_cnt - 2) % 4 == 0) {
811 ref_frame_config->
refresh[1] = 1;
812 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
813 }
else if ((superframe_cnt - 3) % 4 == 0) {
818 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 1;
819 ref_frame_config->
ref_idx[SVC_LAST2_FRAME] = 0;
820 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
831 ref_frame_config->
ref_idx[SVC_GOLDEN_FRAME] = 3;
834 if (base_count > 0) {
835 lag_index = 5 + (base_count % 3);
836 if (superframe_cnt % 4 != 0) lag_index = 5 + ((base_count + 1) % 3);
839 ref_frame_config->
ref_idx[SVC_ALTREF_FRAME] = lag_index;
840 if (superframe_cnt % 4 == 0) {
844 ref_frame_config->
refresh[0] = 1;
845 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
847 if (base_count % 10 == 0) ref_frame_config->
refresh[3] = 1;
849 ref_frame_config->
refresh[lag_index] = 1;
850 }
else if ((superframe_cnt - 1) % 4 == 0) {
853 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
854 }
else if ((superframe_cnt - 2) % 4 == 0) {
857 ref_frame_config->
refresh[1] = 1;
858 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
859 }
else if ((superframe_cnt - 3) % 4 == 0) {
864 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 1;
865 ref_frame_config->
ref_idx[SVC_LAST2_FRAME] = 0;
866 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
869 ref_frame_config->
reference[SVC_GOLDEN_FRAME] = 1;
870 ref_frame_config->
reference[SVC_ALTREF_FRAME] = 1;
883 if (superframe_cnt % 4 == 0) {
887 ref_frame_config->
refresh[0] = 1;
888 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
889 }
else if ((superframe_cnt - 1) % 4 == 0) {
892 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
893 }
else if ((superframe_cnt - 2) % 4 == 0) {
896 ref_frame_config->
refresh[3] = 1;
897 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
898 }
else if ((superframe_cnt - 3) % 4 == 0) {
901 ref_frame_config->
reference[SVC_GOLDEN_FRAME] = 1;
909 ref_frame_config->
refresh[0] = 1;
910 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
914 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 1;
915 ref_frame_config->
ref_idx[SVC_GOLDEN_FRAME] = 0;
916 ref_frame_config->
refresh[1] = 1;
917 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
918 ref_frame_config->
reference[SVC_GOLDEN_FRAME] = 1;
930 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
931 ref_frame_config->
ref_idx[i] = 0;
932 ref_frame_config->
refresh[0] = 1;
933 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
938 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
939 ref_frame_config->
ref_idx[i] = 0;
940 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 1;
941 ref_frame_config->
refresh[1] = 1;
942 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
943 ref_frame_config->
reference[SVC_GOLDEN_FRAME] = 1;
948 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
949 ref_frame_config->
ref_idx[i] = 1;
950 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 2;
951 ref_frame_config->
refresh[2] = 1;
952 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
953 ref_frame_config->
reference[SVC_GOLDEN_FRAME] = 1;
956 if (enable_longterm_temporal_ref) {
957 ref_frame_config->
ref_idx[SVC_ALTREF_FRAME] = REF_FRAMES - 1;
958 ref_frame_config->
reference[SVC_ALTREF_FRAME] = 1;
959 if (base_count % 10 == 0)
960 ref_frame_config->
refresh[REF_FRAMES - 1] = 1;
966 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
967 if (superframe_cnt % 4 == 0) {
973 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
974 ref_frame_config->
ref_idx[i] = 0;
975 ref_frame_config->
refresh[0] = 1;
978 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
979 ref_frame_config->
ref_idx[i] = 0;
980 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 1;
981 ref_frame_config->
refresh[1] = 1;
983 }
else if ((superframe_cnt - 1) % 4 == 0) {
987 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
988 ref_frame_config->
ref_idx[i] = 0;
989 ref_frame_config->
ref_idx[SVC_GOLDEN_FRAME] = 3;
990 ref_frame_config->
refresh[3] = 1;
995 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
996 ref_frame_config->
ref_idx[i] = 3;
997 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 1;
999 }
else if ((superframe_cnt - 2) % 4 == 0) {
1006 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1007 ref_frame_config->
ref_idx[i] = 0;
1008 ref_frame_config->
ref_idx[SVC_GOLDEN_FRAME] = 5 - shift;
1009 ref_frame_config->
refresh[5 - shift] = 1;
1014 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1015 ref_frame_config->
ref_idx[i] = 5 - shift;
1016 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 1;
1017 ref_frame_config->
ref_idx[SVC_LAST3_FRAME] = 6 - shift;
1018 ref_frame_config->
refresh[6 - shift] = 1;
1020 }
else if ((superframe_cnt - 3) % 4 == 0) {
1027 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1028 ref_frame_config->
ref_idx[i] = 0;
1029 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 5 - shift;
1030 ref_frame_config->
ref_idx[SVC_GOLDEN_FRAME] = 3;
1031 ref_frame_config->
refresh[3] = 1;
1035 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1036 ref_frame_config->
ref_idx[i] = 0;
1037 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 6 - shift;
1038 ref_frame_config->
ref_idx[SVC_GOLDEN_FRAME] = 3;
1055 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
1056 if (superframe_cnt % 4 == 0) {
1062 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1063 ref_frame_config->
ref_idx[i] = 0;
1064 ref_frame_config->
refresh[0] = 1;
1069 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1070 ref_frame_config->
ref_idx[i] = 0;
1071 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 1;
1072 ref_frame_config->
refresh[1] = 1;
1077 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1078 ref_frame_config->
ref_idx[i] = 1;
1079 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 2;
1080 ref_frame_config->
refresh[2] = 1;
1082 }
else if ((superframe_cnt - 1) % 4 == 0) {
1089 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1090 ref_frame_config->
ref_idx[i] = 0;
1091 ref_frame_config->
ref_idx[SVC_GOLDEN_FRAME] = 3;
1092 ref_frame_config->
refresh[3] = 1;
1097 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1098 ref_frame_config->
ref_idx[i] = 3;
1099 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 1;
1100 ref_frame_config->
ref_idx[SVC_LAST2_FRAME] = 4;
1101 ref_frame_config->
refresh[4] = 1;
1106 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1107 ref_frame_config->
ref_idx[i] = 4;
1108 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 2;
1110 }
else if ((superframe_cnt - 2) % 4 == 0) {
1117 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1118 ref_frame_config->
ref_idx[i] = 0;
1119 ref_frame_config->
ref_idx[SVC_GOLDEN_FRAME] = 5 - shift;
1120 ref_frame_config->
refresh[5 - shift] = 1;
1125 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1126 ref_frame_config->
ref_idx[i] = 5 - shift;
1127 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 1;
1128 ref_frame_config->
ref_idx[SVC_LAST3_FRAME] = 6 - shift;
1129 ref_frame_config->
refresh[6 - shift] = 1;
1134 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1135 ref_frame_config->
ref_idx[i] = 6 - shift;
1136 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 2;
1137 ref_frame_config->
ref_idx[SVC_LAST3_FRAME] = 7 - shift;
1138 ref_frame_config->
refresh[7 - shift] = 1;
1140 }
else if ((superframe_cnt - 3) % 4 == 0) {
1147 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1148 ref_frame_config->
ref_idx[i] = 0;
1149 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 5 - shift;
1150 ref_frame_config->
ref_idx[SVC_GOLDEN_FRAME] = 3;
1151 ref_frame_config->
refresh[3] = 1;
1155 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1156 ref_frame_config->
ref_idx[i] = 0;
1157 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 6 - shift;
1158 ref_frame_config->
ref_idx[SVC_GOLDEN_FRAME] = 3;
1159 ref_frame_config->
ref_idx[SVC_LAST2_FRAME] = 4;
1160 ref_frame_config->
refresh[4] = 1;
1164 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1165 ref_frame_config->
ref_idx[i] = 0;
1166 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 7 - shift;
1167 ref_frame_config->
ref_idx[SVC_GOLDEN_FRAME] = 4;
1190 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1193 for (i = 0; i < REF_FRAMES; i++) ref_frame_config->
refresh[i] = 0;
1194 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1195 ref_frame_config->
ref_idx[i] = 0;
1202 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 0;
1203 ref_frame_config->
ref_idx[SVC_GOLDEN_FRAME] = 1;
1204 ref_frame_config->
refresh[0] = 1;
1205 ref_frame_config->
refresh[1] = 1;
1210 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 2;
1211 ref_frame_config->
ref_idx[SVC_GOLDEN_FRAME] = 3;
1212 ref_frame_config->
refresh[2] = 1;
1213 ref_frame_config->
refresh[3] = 1;
1218 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 4;
1219 ref_frame_config->
ref_idx[SVC_GOLDEN_FRAME] = 5;
1220 ref_frame_config->
refresh[4] = 1;
1221 ref_frame_config->
refresh[5] = 1;
1223 }
else if (superframe_cnt % 4 == 0) {
1230 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
1231 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1232 ref_frame_config->
ref_idx[i] = 1;
1233 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 0;
1234 ref_frame_config->
refresh[0] = 1;
1239 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
1240 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1241 ref_frame_config->
ref_idx[i] = 3;
1242 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 2;
1243 ref_frame_config->
refresh[2] = 1;
1248 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
1249 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1250 ref_frame_config->
ref_idx[i] = 5;
1251 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 4;
1252 ref_frame_config->
refresh[4] = 1;
1254 }
else if ((superframe_cnt - 1) % 4 == 0) {
1260 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
1261 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1262 ref_frame_config->
ref_idx[i] = 1;
1263 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 0;
1267 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
1268 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1269 ref_frame_config->
ref_idx[i] = 3;
1270 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 2;
1274 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
1275 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1276 ref_frame_config->
ref_idx[i] = 5;
1277 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 4;
1279 }
else if ((superframe_cnt - 2) % 4 == 0) {
1286 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
1287 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1288 ref_frame_config->
ref_idx[i] = 1;
1289 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 0;
1290 ref_frame_config->
refresh[1] = 1;
1295 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
1296 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1297 ref_frame_config->
ref_idx[i] = 3;
1298 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 2;
1299 ref_frame_config->
refresh[3] = 1;
1304 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
1305 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1306 ref_frame_config->
ref_idx[i] = 5;
1307 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 4;
1308 ref_frame_config->
refresh[5] = 1;
1310 }
else if ((superframe_cnt - 3) % 4 == 0) {
1316 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
1317 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1318 ref_frame_config->
ref_idx[i] = 0;
1319 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 1;
1323 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
1324 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1325 ref_frame_config->
ref_idx[i] = 2;
1326 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 3;
1330 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
1331 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1332 ref_frame_config->
ref_idx[i] = 4;
1333 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 5;
1338 ref_frame_config->
reference[SVC_GOLDEN_FRAME] = 1;
1342 if (!is_key_frame) ref_frame_config->
reference[SVC_GOLDEN_FRAME] = 0;
1347 ref_frame_config->
reference[SVC_LAST_FRAME] = 0;
1354 if (!simulcast_mode && enable_longterm_temporal_ref &&
1356 ref_frame_config->
ref_idx[SVC_ALTREF_FRAME] = REF_FRAMES - 1;
1357 if (!is_key_frame) ref_frame_config->
reference[SVC_ALTREF_FRAME] = 1;
1359 ref_frame_config->
refresh[REF_FRAMES - 1] = 1;
1362 default: assert(0); die(
"Error: Unsupported temporal layering mode!\n");
1366static void write_literal(
struct aom_write_bit_buffer *wb,
int data,
int bits,
1368 const int to_write = data - offset;
1369 if (to_write < 0 || to_write >= (1 << bits)) {
1370 die(
"Invalid data, value %d out of range [%d, %d]\n", data, offset,
1371 offset + (1 << bits) - 1);
1373 aom_wb_write_literal(wb, to_write, bits);
1376static void write_depth_representation_element(
1377 struct aom_write_bit_buffer *buffer,
1378 const std::pair<libaom_examples::DepthRepresentationElement, bool>
1380 if (!element.second) {
1383 write_literal(buffer, element.first.sign_flag, 1);
1384 write_literal(buffer, element.first.exponent, 7);
1385 int mantissa_len = 1;
1386 while (mantissa_len < 32 && (element.first.mantissa >> mantissa_len != 0)) {
1389 write_literal(buffer, mantissa_len - 1, 5);
1390 write_literal(buffer, element.first.mantissa, mantissa_len);
1393static void write_color_properties(
1394 struct aom_write_bit_buffer *buffer,
1395 const std::pair<libaom_examples::ColorProperties, bool> &color_properties) {
1396 write_literal(buffer, color_properties.second, 1);
1397 if (color_properties.second) {
1398 write_literal(buffer, color_properties.first.color_range, 1);
1399 write_literal(buffer, color_properties.first.color_primaries, 8);
1400 write_literal(buffer, color_properties.first.transfer_characteristics, 8);
1401 write_literal(buffer, color_properties.first.matrix_coefficients, 8);
1403 write_literal(buffer, 0, 1);
1407static void add_multilayer_metadata(
1408 aom_image_t *frame,
const libaom_examples::MultilayerMetadata &multilayer) {
1411 std::vector<uint8_t> data(66000 * multilayer.layers.size());
1412 struct aom_write_bit_buffer buffer = { data.data(), 0 };
1414 write_literal(&buffer, multilayer.use_case, 6);
1415 if (multilayer.layers.empty()) {
1416 die(
"Invalid multilayer metadata, no layers found\n");
1417 }
else if (multilayer.layers.size() > MAX_NUM_SPATIAL_LAYERS) {
1418 die(
"Invalid multilayer metadata, too many layers (max is %d)\n",
1419 MAX_NUM_SPATIAL_LAYERS);
1421 write_literal(&buffer, (
int)multilayer.layers.size() - 1, 2);
1422 assert(buffer.bit_offset % 8 == 0);
1423 for (
size_t i = 0; i < multilayer.layers.size(); ++i) {
1424 const libaom_examples::LayerMetadata &layer = multilayer.layers[i];
1427 const int bytes_reserved_for_size = 3;
1429 write_literal(&buffer, 0, bytes_reserved_for_size * 8);
1430 const uint32_t metadata_start = buffer.bit_offset;
1431 write_literal(&buffer, (
int)i, 2);
1432 write_literal(&buffer, layer.layer_type, 5);
1433 write_literal(&buffer, layer.luma_plane_only_flag, 1);
1434 write_literal(&buffer, layer.layer_view_type, 3);
1435 write_literal(&buffer, layer.group_id, 2);
1436 write_literal(&buffer, layer.layer_dependency_idc, 3);
1437 write_literal(&buffer, layer.layer_metadata_scope, 2);
1438 write_literal(&buffer, 0, 4);
1441 write_color_properties(&buffer, layer.layer_color_description);
1443 write_literal(&buffer, 0, 2);
1445 assert(buffer.bit_offset % 8 == 0);
1447 if (multilayer.use_case < 12) {
1448 if (layer.layer_type == libaom_examples::MULTIALYER_LAYER_TYPE_ALPHA &&
1449 layer.layer_metadata_scope >= libaom_examples::SCOPE_GLOBAL) {
1450 const libaom_examples::AlphaInformation &alpha_info =
1451 layer.global_alpha_info;
1452 write_literal(&buffer, alpha_info.alpha_use_idc, 3);
1453 write_literal(&buffer, alpha_info.alpha_bit_depth, 3, 8);
1454 write_literal(&buffer, alpha_info.alpha_clip_idc, 2);
1455 write_literal(&buffer, alpha_info.alpha_incr_flag, 1);
1456 write_literal(&buffer, alpha_info.alpha_transparent_value,
1457 alpha_info.alpha_bit_depth);
1458 write_literal(&buffer, alpha_info.alpha_opaque_value,
1459 alpha_info.alpha_bit_depth);
1460 if (buffer.bit_offset % 8 != 0) {
1462 write_literal(&buffer, 0, 8 - (buffer.bit_offset % 8));
1464 assert(buffer.bit_offset % 8 == 0);
1466 if (alpha_info.alpha_use_idc == libaom_examples::ALPHA_STRAIGHT) {
1467 write_literal(&buffer, 0, 6);
1468 write_color_properties(&buffer, alpha_info.alpha_color_description);
1469 }
else if (alpha_info.alpha_use_idc ==
1470 libaom_examples::ALPHA_SEGMENTATION) {
1471 write_literal(&buffer, 0, 7);
1472 write_literal(&buffer, !alpha_info.label_type_id.empty(), 1);
1473 if (!alpha_info.label_type_id.empty()) {
1474 const size_t num_values =
1475 std::abs(alpha_info.alpha_transparent_value -
1476 alpha_info.alpha_opaque_value) +
1478 if (!alpha_info.label_type_id.empty() &&
1479 alpha_info.label_type_id.size() != num_values) {
1480 die(
"Invalid multilayer metadata, label_type_id size must be "
1481 "equal to the range of alpha values between "
1482 "alpha_transparent_value and alpha_opaque_value (expected "
1483 "%d values, found %d values)\n",
1484 (
int)num_values, (
int)alpha_info.label_type_id.size());
1486 for (
size_t j = 0; j < num_values; ++j) {
1487 write_literal(&buffer, alpha_info.label_type_id[j], 16);
1491 assert(buffer.bit_offset % 8 == 0);
1492 }
else if (layer.layer_type ==
1493 libaom_examples::MULTIALYER_LAYER_TYPE_DEPTH &&
1494 layer.layer_metadata_scope >= libaom_examples::SCOPE_GLOBAL) {
1495 const libaom_examples::DepthInformation &depth_info =
1496 layer.global_depth_info;
1497 write_literal(&buffer, depth_info.z_near.second, 1);
1498 write_literal(&buffer, depth_info.z_far.second, 1);
1499 write_literal(&buffer, depth_info.d_min.second, 1);
1500 write_literal(&buffer, depth_info.d_max.second, 1);
1501 write_literal(&buffer, depth_info.depth_representation_type, 4);
1502 if (depth_info.d_min.second || depth_info.d_max.second) {
1503 write_literal(&buffer, depth_info.disparity_ref_view_id, 2);
1505 write_depth_representation_element(&buffer, depth_info.z_near);
1506 write_depth_representation_element(&buffer, depth_info.z_far);
1507 write_depth_representation_element(&buffer, depth_info.d_min);
1508 write_depth_representation_element(&buffer, depth_info.d_max);
1509 if (depth_info.depth_representation_type == 3) {
1510 write_literal(&buffer, depth_info.depth_nonlinear_precision, 4,
1512 if (depth_info.depth_nonlinear_representation_model.empty() ||
1513 depth_info.depth_nonlinear_representation_model.size() >
1515 die(
"Invalid multilayer metadata, if depth_nonlinear_precision "
1516 "== 3, depth_nonlinear_representation_model must have 1 to "
1517 "%d elements, found %d elements\n",
1519 (
int)depth_info.depth_nonlinear_representation_model.size());
1523 (
int)depth_info.depth_nonlinear_representation_model.size() - 1,
1525 const int bit_depth =
1526 depth_info.depth_nonlinear_precision + 8;
1527 for (
const uint32_t v :
1528 depth_info.depth_nonlinear_representation_model) {
1529 write_literal(&buffer, v, bit_depth);
1532 if (buffer.bit_offset % 8 != 0) {
1533 write_literal(&buffer, 0, 8 - (buffer.bit_offset % 8));
1535 assert(buffer.bit_offset % 8 == 0);
1538 assert(buffer.bit_offset % 8 == 0);
1540 const int metadata_size_bytes = (buffer.bit_offset - metadata_start) / 8;
1541 const uint8_t size_pos = metadata_start / 8 - bytes_reserved_for_size;
1543 if (aom_uleb_encode_fixed_size(metadata_size_bytes, bytes_reserved_for_size,
1544 bytes_reserved_for_size,
1545 &buffer.bit_buffer[size_pos], &coded_size)) {
1547 die(
"Error: Failed to write metadata size\n");
1550 assert(buffer.bit_offset % 8 == 0);
1552 buffer.bit_buffer, buffer.bit_offset / 8,
1554 die(
"Error: Failed to add metadata\n");
1558#if CONFIG_AV1_DECODER
1562 const int frames_out) {
1570#if CONFIG_AV1_HIGHBITDEPTH
1578 enc_img.
d_w, enc_img.
d_h, 16);
1579 aom_img_truncate_16_to_8(&enc_hbd_img, &enc_img);
1580 enc_img = enc_hbd_img;
1587 dec_img.
d_w, dec_img.
d_h, 16);
1588 aom_img_truncate_16_to_8(&dec_hbd_img, &dec_img);
1589 dec_img = dec_hbd_img;
1594 if (!aom_compare_img(&enc_img, &dec_img)) {
1595 int y[4], u[4], v[4];
1596#if CONFIG_AV1_HIGHBITDEPTH
1598 aom_find_mismatch_high(&enc_img, &dec_img, y, u, v);
1600 aom_find_mismatch(&enc_img, &dec_img, y, u, v);
1603 aom_find_mismatch(&enc_img, &dec_img, y, u, v);
1606 "Encode/decode mismatch on frame %d at"
1607 " Y[%d, %d] {%d/%d},"
1608 " U[%d, %d] {%d/%d},"
1609 " V[%d, %d] {%d/%d}\n",
1610 frames_out, y[0], y[1], y[2], y[3], u[0], u[1], u[2], u[3], v[0],
1623 uint64_t psnr_sse_total[2];
1624 uint64_t psnr_samples_total[2];
1625 double psnr_totals[2][4];
1629static void show_psnr(
struct psnr_stats *psnr_stream,
double peak) {
1632 if (!psnr_stream->psnr_count[0])
return;
1634 fprintf(stderr,
"\nPSNR (Overall/Avg/Y/U/V)");
1635 ovpsnr = sse_to_psnr((
double)psnr_stream->psnr_samples_total[0], peak,
1636 (
double)psnr_stream->psnr_sse_total[0]);
1637 fprintf(stderr,
" %.3f", ovpsnr);
1639 for (
int i = 0; i < 4; i++) {
1640 fprintf(stderr,
" %.3f",
1641 psnr_stream->psnr_totals[0][i] / psnr_stream->psnr_count[0]);
1643 fprintf(stderr,
"\n");
1646static aom::AV1RateControlRtcConfig create_rtc_rc_config(
1648 aom::AV1RateControlRtcConfig rc_cfg;
1649 rc_cfg.width = cfg.
g_w;
1650 rc_cfg.height = cfg.
g_h;
1660 rc_cfg.max_intra_bitrate_pct = 300;
1663 rc_cfg.ss_number_layers = 1;
1664 rc_cfg.ts_number_layers = 1;
1665 rc_cfg.scaling_factor_num[0] = 1;
1666 rc_cfg.scaling_factor_den[0] = 1;
1667 rc_cfg.layer_target_bitrate[0] =
static_cast<int>(rc_cfg.target_bandwidth);
1668 rc_cfg.max_quantizers[0] = rc_cfg.max_quantizer;
1669 rc_cfg.min_quantizers[0] = rc_cfg.min_quantizer;
1670 rc_cfg.aq_mode = app_input.aq_mode;
1675static int qindex_to_quantizer(
int qindex) {
1678 static const int quantizer_to_qindex[] = {
1679 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48,
1680 52, 56, 60, 64, 68, 72, 76, 80, 84, 88, 92, 96, 100,
1681 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144, 148, 152,
1682 156, 160, 164, 168, 172, 176, 180, 184, 188, 192, 196, 200, 204,
1683 208, 212, 216, 220, 224, 228, 232, 236, 240, 244, 249, 255,
1685 for (
int quantizer = 0; quantizer < 64; ++quantizer)
1686 if (quantizer_to_qindex[quantizer] >= qindex)
return quantizer;
1695 map.
rows = (cfg->
g_h + 15) / 16;
1696 map.
cols = (cfg->
g_w + 15) / 16;
1699 if (!map.
active_map) die(
"Failed to allocate active map");
1702 for (
unsigned int i = 0; i < map.
rows; ++i) {
1703 for (
unsigned int j = 0; j < map.
cols; ++j) {
1704 int index = map.
cols * i + j;
1706 if (frame_cnt < 300) {
1708 }
else if (frame_cnt >= 300) {
1709 if (i < map.rows / 2 && j >= map.
cols / 2) map.
active_map[index] = 0;
1715 die_codec(codec,
"Failed to set active map");
1720int main(
int argc,
const char **argv) {
1724 AvxVideoWriter *total_layer_file = NULL;
1725 FILE *total_layer_obu_file = NULL;
1734 int frame_duration = 1;
1740#if CONFIG_INTERNAL_STATS
1741 FILE *stats_file = fopen(
"opsnr.stt",
"a");
1742 if (stats_file == NULL) {
1743 die(
"Cannot open opsnr.stt\n");
1746#if CONFIG_AV1_DECODER
1750 struct RateControlMetrics rc;
1751 int64_t cx_time = 0;
1754 double sum_bitrate = 0.0;
1755 double sum_bitrate2 = 0.0;
1756 double framerate = 30.0;
1757 int use_svc_control = 1;
1758 int set_err_resil_frame = 0;
1759 int test_changing_bitrate = 0;
1760 zero(rc.layer_target_bitrate);
1762 memset(&app_input, 0,
sizeof(AppInput));
1763 memset(&svc_params, 0,
sizeof(svc_params));
1767 const int test_dynamic_scaling_single_layer = 0;
1770 const int test_speed_per_layer = 0;
1773 const int test_active_maps = 0;
1776 for (i = 0; i < MAX_NUM_SPATIAL_LAYERS; ++i) {
1777 app_input.input_ctx[i].framerate.numerator = 30;
1778 app_input.input_ctx[i].framerate.denominator = 1;
1779 app_input.input_ctx[i].only_i420 = 0;
1780 app_input.input_ctx[i].bit_depth =
AOM_BITS_8;
1782 app_input.speed = 7;
1783 exec_name = argv[0];
1809 parse_command_line(argc, argv, &app_input, &svc_params, &cfg);
1814 unsigned int width = cfg.
g_w;
1815 unsigned int height = cfg.
g_h;
1817 if (app_input.layering_mode >= 0) {
1818 if (ts_number_layers !=
1819 mode_to_num_temporal_layers[app_input.layering_mode] ||
1821 mode_to_num_spatial_layers[app_input.layering_mode]) {
1822 die(
"Number of layers doesn't match layering mode.");
1826 bool has_non_y4m_input =
false;
1828 if (app_input.input_ctx[i].file_type != FILE_TYPE_Y4M) {
1829 has_non_y4m_input =
true;
1834 if (has_non_y4m_input) {
1836 die(
"Failed to allocate image (%dx%d)", width, height);
1845 unsigned int total_rate = 0;
1846 for (i = 0; i < ss_number_layers; i++) {
1852 die(
"Incorrect total target bitrate, expected: %d", total_rate);
1856 if (ts_number_layers == 2) {
1859 }
else if (ts_number_layers == 3) {
1865 libaom_examples::MultilayerMetadata multilayer_metadata;
1866 if (app_input.multilayer_metadata_file != NULL) {
1867 multilayer_metadata = libaom_examples::parse_multilayer_file(
1868 app_input.multilayer_metadata_file);
1869 libaom_examples::print_multilayer_metadata(multilayer_metadata);
1873 set_rate_control_metrics(&rc, framerate, ss_number_layers, ts_number_layers);
1876 info.codec_fourcc = get_fourcc_by_aom_encoder(encoder);
1877 info.frame_width = cfg.
g_w;
1878 info.frame_height = cfg.
g_h;
1882 for (
int sl = 0; sl < ss_number_layers; ++sl) {
1883 for (
int tl = 0; tl < ts_number_layers; ++tl) {
1884 i = sl * ts_number_layers + tl;
1885 char file_name[PATH_MAX];
1886 snprintf(file_name,
sizeof(file_name),
"%s_%d.av1",
1887 app_input.output_filename, i);
1888 if (app_input.output_obu) {
1889 obu_files[i] = fopen(file_name,
"wb");
1890 if (!obu_files[i]) die(
"Failed to open %s for writing", file_name);
1892 outfile[i] = aom_video_writer_open(file_name, kContainerIVF, &info);
1893 if (!outfile[i]) die(
"Failed to open %s for writing", file_name);
1897 if (app_input.output_obu) {
1898 total_layer_obu_file = fopen(app_input.output_filename,
"wb");
1899 if (!total_layer_obu_file)
1900 die(
"Failed to open %s for writing", app_input.output_filename);
1903 aom_video_writer_open(app_input.output_filename, kContainerIVF, &info);
1904 if (!total_layer_file)
1905 die(
"Failed to open %s for writing", app_input.output_filename);
1914 die_codec(&codec,
"Failed to initialize encoder");
1916#if CONFIG_AV1_DECODER
1917 if (app_input.decode) {
1919 die_codec(&decoder,
"Failed to initialize decoder");
1950 if (app_input.tune_content == AOM_CONTENT_SCREEN) {
1956 if (app_input.use_external_rc) {
1969 for (i = 0; i < ss_number_layers * ts_number_layers; ++i) {
1973 if (!app_input.scale_factors_explicitly_set) {
1974 for (i = 0; i < ss_number_layers; ++i) {
1978 if (ss_number_layers == 2) {
1981 }
else if (ss_number_layers == 3) {
1995 const int max_intra_size_pct = 300;
1997 max_intra_size_pct);
2000 for (
int lx = 0; lx < ts_number_layers * ss_number_layers; lx++) {
2001 cx_time_layer[lx] = 0;
2002 frame_cnt_layer[lx] = 0;
2005 std::unique_ptr<aom::AV1RateControlRTC> rc_api;
2006 if (app_input.use_external_rc) {
2007 const aom::AV1RateControlRtcConfig rc_cfg =
2008 create_rtc_rc_config(cfg, app_input);
2009 rc_api = aom::AV1RateControlRTC::Create(rc_cfg);
2013 struct psnr_stats psnr_stream;
2014 memset(&psnr_stream, 0,
sizeof(psnr_stream));
2015 while (frame_avail || got_data) {
2016 struct aom_usec_timer timer;
2017 frame_avail = read_frame(&(app_input.input_ctx[0]), &raw);
2019 for (
int slx = 0; slx < ss_number_layers; slx++) {
2020 if (slx > 0 && app_input.input_ctx[slx].filename != NULL) {
2021 const int previous_layer_frame_avail = frame_avail;
2022 frame_avail = read_frame(&(app_input.input_ctx[slx]), &raw);
2023 if (previous_layer_frame_avail != frame_avail) {
2024 die(
"Mismatch in number of frames between spatial layer input files");
2032 int is_key_frame = (frame_cnt % cfg.
kf_max_dist) == 0;
2034 if (app_input.layering_mode >= 0) {
2037 set_layer_pattern(app_input.layering_mode, frame_cnt, &layer_id,
2038 &ref_frame_config, &ref_frame_comp_pred,
2039 &use_svc_control, slx, is_key_frame,
2040 (app_input.layering_mode == 10), app_input.speed);
2042 if (use_svc_control) {
2046 &ref_frame_comp_pred);
2048 if (app_input.multilayer_metadata_file != NULL) {
2049 add_multilayer_metadata(&raw, multilayer_metadata);
2052 if (test_speed_per_layer) {
2053 int speed_per_layer = 10;
2075 if (ts_number_layers == 2) {
2077 }
else if (ts_number_layers == 3) {
2078 if (frame_cnt % 2 != 0)
2080 else if ((frame_cnt > 1) && ((frame_cnt - 2) % 4 == 0))
2094 const int err_resil_mode =
2101 if (frame_avail && slx == 0) ++rc.layer_input_frames[layer];
2103 if (test_dynamic_scaling_single_layer) {
2106 int frame_2x2 = 200;
2107 int frame_4x4 = 400;
2108 int frame_2x2up = 600;
2109 int frame_orig = 800;
2110 if (frame_cnt >= frame_2x2 && frame_cnt < frame_4x4) {
2114 }
else if (frame_cnt >= frame_4x4 && frame_cnt < frame_2x2up) {
2118 }
else if (frame_cnt >= frame_2x2up && frame_cnt < frame_orig) {
2122 }
else if (frame_cnt >= frame_orig) {
2127 if (frame_cnt == frame_2x2 || frame_cnt == frame_4x4 ||
2128 frame_cnt == frame_2x2up || frame_cnt == frame_orig) {
2134 for (i = 0; i < REF_FRAMES; i++) ref_frame_config.
refresh[i] = 1;
2135 if (use_svc_control) {
2139 &ref_frame_comp_pred);
2145 if (test_changing_bitrate && frame_cnt % 2 == 0) {
2146 if (frame_cnt < 500)
2158 die_codec(&codec,
"Failed to SET_BITRATE_ONE_PASS_CBR");
2162 aom::AV1FrameParamsRTC frame_params;
2164 frame_params.spatial_layer_id = 0;
2165 frame_params.temporal_layer_id = 0;
2166 frame_params.frame_type =
2167 is_key_frame ? aom::kKeyFrame : aom::kInterFrame;
2168 rc_api->ComputeQP(frame_params);
2169 const int current_qp = rc_api->GetQP();
2171 qindex_to_quantizer(current_qp))) {
2172 die_codec(&codec,
"Failed to SET_QUANTIZER_ONE_PASS");
2176 if (test_active_maps) set_active_map(&cfg, &codec, frame_cnt);
2179 aom_usec_timer_start(&timer);
2181 die_codec(&codec,
"Failed to encode frame");
2182 aom_usec_timer_mark(&timer);
2183 cx_time += aom_usec_timer_elapsed(&timer);
2184 cx_time_layer[layer] += aom_usec_timer_elapsed(&timer);
2185 frame_cnt_layer[layer] += 1;
2188 int content_flag = 0;
2191 die_codec(&codec,
"Failed to GET_HIGH_MOTION_CONTENT_SCREEN_RTC");
2196 int ss_layers_write = (app_input.layering_mode == 11)
2200 switch (pkt->
kind) {
2206 int j = sl * ts_number_layers + tl;
2207 if (app_input.output_obu) {
2211 aom_video_writer_write_frame(
2213 reinterpret_cast<const uint8_t *
>(pkt->
data.
frame.
buf),
2217 rc.layer_encoding_bitrate[j] += 8.0 * pkt->
data.
frame.
sz;
2222 if (app_input.output_obu) {
2224 total_layer_obu_file);
2226 aom_video_writer_write_frame(
2228 reinterpret_cast<const uint8_t *
>(pkt->
data.
frame.
buf),
2236 rc.layer_avg_frame_size[j] += 8.0 * pkt->
data.
frame.
sz;
2237 rc.layer_avg_rate_mismatch[j] +=
2238 fabs(8.0 * pkt->
data.
frame.
sz - rc.layer_pfb[j]) /
2250 if (frame_cnt > rc.window_size && slx == ss_number_layers - 1) {
2251 sum_bitrate += 0.001 * 8.0 * pkt->
data.
frame.
sz * framerate;
2252 rc.window_size = (rc.window_size <= 0) ? 1 : rc.window_size;
2253 if (frame_cnt % rc.window_size == 0) {
2254 rc.window_count += 1;
2255 rc.avg_st_encoding_bitrate += sum_bitrate / rc.window_size;
2256 rc.variance_st_encoding_bitrate +=
2257 (sum_bitrate / rc.window_size) *
2258 (sum_bitrate / rc.window_size);
2263 if (frame_cnt > rc.window_size + rc.window_size / 2 &&
2264 slx == ss_number_layers - 1) {
2265 sum_bitrate2 += 0.001 * 8.0 * pkt->
data.
frame.
sz * framerate;
2266 if (frame_cnt > 2 * rc.window_size &&
2267 frame_cnt % rc.window_size == 0) {
2268 rc.window_count += 1;
2269 rc.avg_st_encoding_bitrate += sum_bitrate2 / rc.window_size;
2270 rc.variance_st_encoding_bitrate +=
2271 (sum_bitrate2 / rc.window_size) *
2272 (sum_bitrate2 / rc.window_size);
2277#if CONFIG_AV1_DECODER
2278 if (app_input.decode) {
2281 reinterpret_cast<const uint8_t *
>(pkt->
data.
frame.
buf),
2283 die_codec(&decoder,
"Failed to decode frame");
2289 if (app_input.show_psnr) {
2290 psnr_stream.psnr_sse_total[0] += pkt->
data.
psnr.sse[0];
2291 psnr_stream.psnr_samples_total[0] += pkt->
data.
psnr.samples[0];
2292 for (
int plane = 0; plane < 4; plane++) {
2293 psnr_stream.psnr_totals[0][plane] += pkt->
data.
psnr.psnr[plane];
2295 psnr_stream.psnr_count[0]++;
2301#if CONFIG_AV1_DECODER
2302 if (got_data && app_input.decode) {
2305 if ((ss_number_layers > 1 || ts_number_layers > 1) &&
2308 if (test_decode(&codec, &decoder, frame_cnt)) {
2309#if CONFIG_INTERNAL_STATS
2310 fprintf(stats_file,
"First mismatch occurred in frame %d\n",
2314 fatal(
"Mismatch seen");
2321 pts += frame_duration;
2324 for (i = 0; i < MAX_NUM_SPATIAL_LAYERS; ++i) {
2325 if (app_input.input_ctx[i].filename == NULL) {
2328 close_input_file(&(app_input.input_ctx[i]));
2330 printout_rate_control_summary(&rc, frame_cnt, ss_number_layers,
2334 for (
int slx = 0; slx < ss_number_layers; slx++)
2335 for (
int tlx = 0; tlx < ts_number_layers; tlx++) {
2336 int lx = slx * ts_number_layers + tlx;
2337 printf(
"Per layer encoding time/FPS stats for encoder: %d %d %d %f %f \n",
2338 slx, tlx, frame_cnt_layer[lx],
2339 (
float)cx_time_layer[lx] / (
double)(frame_cnt_layer[lx] * 1000),
2340 1000000 * (
double)frame_cnt_layer[lx] / (
double)cx_time_layer[lx]);
2344 printf(
"Frame cnt and encoding time/FPS stats for encoding: %d %f %f\n",
2345 frame_cnt, 1000 * (
float)cx_time / (
double)(frame_cnt * 1000000),
2346 1000000 * (
double)frame_cnt / (
double)cx_time);
2348 if (app_input.show_psnr) {
2349 show_psnr(&psnr_stream, 255.0);
2354#if CONFIG_AV1_DECODER
2355 if (app_input.decode) {
2357 die_codec(&decoder,
"Failed to destroy decoder");
2361#if CONFIG_INTERNAL_STATS
2362 fprintf(stats_file,
"No mismatch detected in recon buffers\n");
2367 for (i = 0; i < ss_number_layers * ts_number_layers; ++i)
2368 aom_video_writer_close(outfile[i]);
2369 aom_video_writer_close(total_layer_file);
2371 if (has_non_y4m_input) {
2374 return EXIT_SUCCESS;
Describes the decoder algorithm interface to applications.
Describes the encoder algorithm interface to applications.
Describes the aom image descriptor and associated operations.
@ AOM_MIF_KEY_FRAME
Definition aom_image.h:166
@ AOM_CSP_UNKNOWN
Definition aom_image.h:143
enum aom_chroma_sample_position aom_chroma_sample_position_t
List of chroma sample positions.
#define AOM_IMG_FMT_HIGHBITDEPTH
Definition aom_image.h:38
aom_image_t * aom_img_alloc(aom_image_t *img, aom_img_fmt_t fmt, unsigned int d_w, unsigned int d_h, unsigned int align)
Open a descriptor, allocating storage for the underlying image.
@ AOM_IMG_FMT_I420
Definition aom_image.h:45
enum aom_img_fmt aom_img_fmt_t
List of supported image formats.
int aom_img_add_metadata(aom_image_t *img, uint32_t type, const uint8_t *data, size_t sz, aom_metadata_insert_flags_t insert_flag)
Add metadata to image.
void aom_img_free(aom_image_t *img)
Close an image descriptor.
Provides definitions for using AOM or AV1 encoder algorithm within the aom Codec Interface.
#define AOM_MAX_LAYERS
Definition aomcx.h:1713
#define AOM_MAX_TS_LAYERS
Definition aomcx.h:1715
aom_codec_iface_t * aom_codec_av1_cx(void)
The interface to the AV1 encoder.
@ AOM_FULL_SUPERFRAME_DROP
Definition aomcx.h:1775
@ AV1E_SET_BITRATE_ONE_PASS_CBR
Codec control to set the target bitrate in kilobits per second, unsigned int parameter....
Definition aomcx.h:1533
@ AV1E_SET_ENABLE_SMOOTH_INTRA
Codec control function to turn on / off smooth intra modes usage, int parameter.
Definition aomcx.h:1076
@ AV1E_SET_ENABLE_TPL_MODEL
Codec control function to enable RDO modulated by frame temporal dependency, unsigned int parameter.
Definition aomcx.h:414
@ AV1E_SET_AQ_MODE
Codec control function to set adaptive quantization mode, unsigned int parameter.
Definition aomcx.h:474
@ AV1E_SET_SVC_LAYER_ID
Codec control function to set the layer id, aom_svc_layer_id_t* parameter.
Definition aomcx.h:1282
@ AV1E_SET_SVC_REF_FRAME_CONFIG
Codec control function to set the reference frame config, aom_svc_ref_frame_config_t* parameter.
Definition aomcx.h:1292
@ AV1E_SET_TUNE_CONTENT
Codec control function to set content type, aom_tune_content parameter.
Definition aomcx.h:503
@ AV1E_SET_CDF_UPDATE_MODE
Codec control function to set CDF update mode, unsigned int parameter.
Definition aomcx.h:512
@ AV1E_SET_ENABLE_ANGLE_DELTA
Codec control function to turn on/off intra angle delta, int parameter.
Definition aomcx.h:1123
@ AV1E_SET_MV_COST_UPD_FREQ
Control to set frequency of the cost updates for motion vectors, unsigned int parameter.
Definition aomcx.h:1260
@ AV1E_SET_INTRA_DEFAULT_TX_ONLY
Control to use default tx type only for intra modes, int parameter.
Definition aomcx.h:1209
@ AV1E_SET_SVC_REF_FRAME_COMP_PRED
Codec control function to set reference frame compound prediction. aom_svc_ref_frame_comp_pred_t* par...
Definition aomcx.h:1397
@ AV1E_SET_ENABLE_INTRABC
Codec control function to turn on/off intra block copy mode, int parameter.
Definition aomcx.h:1119
@ AV1E_SET_ENABLE_WARPED_MOTION
Codec control function to turn on / off warped motion usage at sequence level, int parameter.
Definition aomcx.h:1044
@ AV1E_SET_RTC_EXTERNAL_RC
Codec control function to set flag for rate control used by external encoders.
Definition aomcx.h:1432
@ AV1E_SET_COEFF_COST_UPD_FREQ
Control to set frequency of the cost updates for coefficients, unsigned int parameter.
Definition aomcx.h:1240
@ AV1E_SET_ENABLE_CDEF
Codec control function to encode with CDEF, unsigned int parameter.
Definition aomcx.h:676
@ AOME_SET_ACTIVEMAP
Codec control function to pass an Active map to encoder, aom_active_map_t* parameter.
Definition aomcx.h:190
@ AV1E_SET_DV_COST_UPD_FREQ
Control to set frequency of the cost updates for intrabc motion vectors, unsigned int parameter.
Definition aomcx.h:1363
@ AV1E_SET_SVC_FRAME_DROP_MODE
Codec control to set the frame drop mode for SVC, unsigned int parameter. The valid values are consta...
Definition aomcx.h:1546
@ AV1E_SET_SVC_PARAMS
Codec control function to set SVC parameters, aom_svc_params_t* parameter.
Definition aomcx.h:1287
@ AV1E_SET_ENABLE_FILTER_INTRA
Codec control function to turn on / off filter intra usage at sequence level, int parameter.
Definition aomcx.h:1065
@ AV1E_SET_ENABLE_PALETTE
Codec control function to turn on/off palette mode, int parameter.
Definition aomcx.h:1115
@ AV1E_SET_ENABLE_CFL_INTRA
Codec control function to turn on / off CFL uv intra mode usage, int parameter.
Definition aomcx.h:1094
@ AOME_SET_MAX_INTRA_BITRATE_PCT
Codec control function to set max data rate for intra frames, unsigned int parameter.
Definition aomcx.h:312
@ AV1E_SET_ERROR_RESILIENT_MODE
Codec control function to enable error_resilient_mode, int parameter.
Definition aomcx.h:448
@ AV1E_SET_ENABLE_OBMC
Codec control function to predict with OBMC mode, unsigned int parameter.
Definition aomcx.h:703
@ AV1E_SET_AUTO_TILES
Codec control to set auto tiling, unsigned int parameter. Value of 1 means encoder will set number of...
Definition aomcx.h:1554
@ AV1E_SET_LOOPFILTER_CONTROL
Codec control to control loop filter.
Definition aomcx.h:1412
@ AOME_SET_SCALEMODE
Codec control function to set encoder scaling mode for the next frame to be coded,...
Definition aomcx.h:197
@ AV1E_SET_ENABLE_ORDER_HINT
Codec control function to turn on / off frame order hint (int parameter). Affects: joint compound mod...
Definition aomcx.h:871
@ AV1E_SET_DELTAQ_MODE
Codec control function to set the delta q mode, unsigned int parameter.
Definition aomcx.h:1137
@ AV1E_SET_POSTENCODE_DROP_RTC
Codec control to enable post encode frame drop for RTC encoding, int parameter.
Definition aomcx.h:1570
@ AV1E_SET_ENABLE_GLOBAL_MOTION
Codec control function to turn on / off global motion usage for a sequence, int parameter.
Definition aomcx.h:1034
@ AOME_SET_CPUUSED
Codec control function to set encoder internal speed settings, int parameter.
Definition aomcx.h:220
@ AV1E_GET_HIGH_MOTION_CONTENT_SCREEN_RTC
Codec control to get the high motion content flag, used for screen content realtime (RTC) encoding,...
Definition aomcx.h:1561
@ AV1E_SET_GF_CBR_BOOST_PCT
Boost percentage for Golden Frame in CBR mode, unsigned int parameter.
Definition aomcx.h:345
@ AV1E_SET_QUANTIZER_ONE_PASS
Codec control to set quantizer for the next frame, int parameter.
Definition aomcx.h:1495
@ AV1E_SET_MODE_COST_UPD_FREQ
Control to set frequency of the cost updates for mode, unsigned int parameter.
Definition aomcx.h:1250
@ AV1E_SET_MAX_CONSEC_FRAME_DROP_MS_CBR
Codec control to set the maximum number of consecutive frame drops, in units of time (milliseconds),...
Definition aomcx.h:1576
@ AV1_GET_NEW_FRAME_IMAGE
Codec control function to get a pointer to the new frame.
Definition aom.h:70
const char * aom_codec_iface_name(aom_codec_iface_t *iface)
Return the name for a given interface.
enum aom_bit_depth aom_bit_depth_t
Bit depth for codecThis enumeration determines the bit depth of the codec.
aom_codec_err_t aom_codec_control(aom_codec_ctx_t *ctx, int ctrl_id,...)
Algorithm Control.
long aom_codec_flags_t
Initialization-time Feature Enabling.
Definition aom_codec.h:232
const struct aom_codec_iface aom_codec_iface_t
Codec interface structure.
Definition aom_codec.h:271
aom_codec_err_t aom_codec_destroy(aom_codec_ctx_t *ctx)
Destroy a codec instance.
const char * aom_codec_err_to_string(aom_codec_err_t err)
Convert error number to printable string.
aom_codec_err_t
Algorithm return codes.
Definition aom_codec.h:155
#define AOM_CODEC_CONTROL_TYPECHECKED(ctx, id, data)
aom_codec_control wrapper macro (adds type-checking, less flexible)
Definition aom_codec.h:542
const void * aom_codec_iter_t
Iterator.
Definition aom_codec.h:305
#define AOM_FRAME_IS_KEY
Definition aom_codec.h:288
@ AOM_BITS_8
Definition aom_codec.h:336
@ AOM_BITS_10
Definition aom_codec.h:337
@ AOM_CODEC_INVALID_PARAM
An application-supplied parameter is not valid.
Definition aom_codec.h:200
@ AOM_CODEC_MEM_ERROR
Memory operation failed.
Definition aom_codec.h:163
@ AOM_CODEC_OK
Operation completed without error.
Definition aom_codec.h:157
aom_codec_err_t aom_codec_decode(aom_codec_ctx_t *ctx, const uint8_t *data, size_t data_sz, void *user_priv)
Decode data.
#define aom_codec_dec_init(ctx, iface, cfg, flags)
Convenience macro for aom_codec_dec_init_ver()
Definition aom_decoder.h:129
const aom_codec_cx_pkt_t * aom_codec_get_cx_data(aom_codec_ctx_t *ctx, aom_codec_iter_t *iter)
Encoded data iterator.
aom_codec_err_t aom_codec_encode(aom_codec_ctx_t *ctx, const aom_image_t *img, aom_codec_pts_t pts, unsigned long duration, aom_enc_frame_flags_t flags)
Encode a frame.
#define aom_codec_enc_init(ctx, iface, cfg, flags)
Convenience macro for aom_codec_enc_init_ver()
Definition aom_encoder.h:943
aom_codec_err_t aom_codec_enc_config_default(aom_codec_iface_t *iface, aom_codec_enc_cfg_t *cfg, unsigned int usage)
Get the default configuration for a usage.
#define AOM_USAGE_REALTIME
usage parameter analogous to AV1 REALTIME mode.
Definition aom_encoder.h:1016
#define AOM_CODEC_USE_HIGHBITDEPTH
Definition aom_encoder.h:80
#define AOM_CODEC_USE_PSNR
Initialization-time Feature Enabling.
Definition aom_encoder.h:79
@ AOM_CBR
Definition aom_encoder.h:187
@ AOM_KF_AUTO
Definition aom_encoder.h:202
@ AOM_CODEC_PSNR_PKT
Definition aom_encoder.h:113
@ AOM_CODEC_CX_FRAME_PKT
Definition aom_encoder.h:110
aom active region map
Definition aomcx.h:1632
unsigned int rows
Definition aomcx.h:1635
unsigned int cols
Definition aomcx.h:1636
unsigned char * active_map
specify an on (1) or off (0) each 16x16 region within a frame
Definition aomcx.h:1634
Codec context structure.
Definition aom_codec.h:315
Encoder output packet.
Definition aom_encoder.h:122
size_t sz
Definition aom_encoder.h:127
enum aom_codec_cx_pkt_kind kind
Definition aom_encoder.h:123
double psnr[4]
Definition aom_encoder.h:145
union aom_codec_cx_pkt::@1 data
struct aom_codec_cx_pkt::@1::@2 frame
aom_codec_frame_flags_t flags
Definition aom_encoder.h:132
void * buf
Definition aom_encoder.h:126
Encoder configuration structure.
Definition aom_encoder.h:387
unsigned int g_input_bit_depth
Bit-depth of the input frames.
Definition aom_encoder.h:475
unsigned int rc_dropframe_thresh
Temporal resampling configuration, if supported by the codec.
Definition aom_encoder.h:540
struct aom_rational g_timebase
Stream timebase units.
Definition aom_encoder.h:489
unsigned int g_usage
Algorithm specific "usage" value.
Definition aom_encoder.h:399
unsigned int rc_buf_sz
Decoder Buffer Size.
Definition aom_encoder.h:705
unsigned int g_h
Height of the frame.
Definition aom_encoder.h:435
enum aom_kf_mode kf_mode
Keyframe placement mode.
Definition aom_encoder.h:768
enum aom_rc_mode rc_end_usage
Rate control algorithm to use.
Definition aom_encoder.h:623
unsigned int g_threads
Maximum number of threads to use.
Definition aom_encoder.h:407
unsigned int kf_min_dist
Keyframe minimum interval.
Definition aom_encoder.h:777
unsigned int g_lag_in_frames
Allow lagged encoding.
Definition aom_encoder.h:518
unsigned int rc_buf_initial_sz
Decoder Buffer Initial Size.
Definition aom_encoder.h:714
unsigned int g_profile
Bitstream profile to use.
Definition aom_encoder.h:417
aom_bit_depth_t g_bit_depth
Bit-depth of the codec.
Definition aom_encoder.h:467
unsigned int g_w
Width of the frame.
Definition aom_encoder.h:426
unsigned int rc_undershoot_pct
Rate control adaptation undershoot control.
Definition aom_encoder.h:681
unsigned int kf_max_dist
Keyframe maximum interval.
Definition aom_encoder.h:786
aom_codec_er_flags_t g_error_resilient
Enable error resilient modes.
Definition aom_encoder.h:497
unsigned int rc_max_quantizer
Maximum (Worst Quality) Quantizer.
Definition aom_encoder.h:668
unsigned int rc_buf_optimal_sz
Decoder Buffer Optimal Size.
Definition aom_encoder.h:723
unsigned int rc_min_quantizer
Minimum (Best Quality) Quantizer.
Definition aom_encoder.h:658
unsigned int rc_target_bitrate
Target data rate.
Definition aom_encoder.h:644
unsigned int rc_resize_mode
Mode for spatial resampling, if supported by the codec.
Definition aom_encoder.h:549
unsigned int rc_overshoot_pct
Rate control adaptation overshoot control.
Definition aom_encoder.h:690
Image Descriptor.
Definition aom_image.h:182
aom_img_fmt_t fmt
Definition aom_image.h:183
unsigned int d_w
Definition aom_image.h:197
unsigned int d_h
Definition aom_image.h:198
int num
Definition aom_encoder.h:165
int den
Definition aom_encoder.h:166
aom image scaling mode
Definition aomcx.h:1644
int temporal_layer_id
Definition aomcx.h:1720
int spatial_layer_id
Definition aomcx.h:1719
int max_quantizers[32]
Definition aomcx.h:1732
int number_spatial_layers
Definition aomcx.h:1730
int layer_target_bitrate[32]
Definition aomcx.h:1737
int framerate_factor[8]
Definition aomcx.h:1739
int min_quantizers[32]
Definition aomcx.h:1733
int scaling_factor_den[4]
Definition aomcx.h:1735
int number_temporal_layers
Definition aomcx.h:1731
int scaling_factor_num[4]
Definition aomcx.h:1734
int use_comp_pred[3]
Definition aomcx.h:1769
int reference[7]
Definition aomcx.h:1759
int refresh[8]
Definition aomcx.h:1762
int ref_idx[7]
Definition aomcx.h:1761